﻿using System.Reflection;

namespace 依赖注入
{
    /// <summary>
    /// 根据反射的方式，实现自动依赖注入
    /// </summary>
    public static class RegisterServicesByReflect
    {
        public static IServiceCollection RegisterServicesByReflection(this IServiceCollection services)
        {
            var entryAssembly= Assembly.GetEntryAssembly(); //获取正在运行的应用程序的入口程序集
            var types= entryAssembly?.GetTypes();
            foreach (var type in types) {
                if (typeof(ITransient).IsAssignableFrom(type)) //判断一个类型是否可以被另一个类型所接受  (Itransient是当前类型的接口)
                {
                    services.AddTransient(type.GetInterfaces().FirstOrDefault() ?? type, type);
                }
                else if (typeof(IScoped).IsAssignableFrom(type))
                {
                    services.AddScoped(type.GetInterfaces().FirstOrDefault() ?? type, type);
                }
                else if (typeof(ISingleton).IsAssignableFrom(type))
                {
                    services.AddSingleton(type.GetInterfaces().FirstOrDefault() ?? type, type);
                }
            }
            return services;
        }
        //在Program.cs 中 builder.Services.RegisterServicesByReflection();
    }

    public interface ITransient { }
    public interface IScoped { }
    public interface ISingleton { }
}
